#面向过程的程序设计把计算机程序视为一系列的命令集合，即一组函数的顺序执行。
#面向对象的程序设计把计算机程序视为一组对象的集合，而每个对象都可以接收其他对象发过来的消息，并处理这些消息，计算机程序的执行就是一系列消息在各个对象之间传递。

# 类（Class）和 实例（Instance）
## 类是对象的模板，定义了对象的属性和方法。对象是类的实例，通过类创建

#定义类
class Dog(object):
    # 构造函数
    def __init__(self, name, voice):
        # self 关键字代表具体的实例；下方在初始化类的属性
        self.name = name
        self.voice = voice
        self.__color = 'white' # 私有属性表示，只能在类的内部访问

    def sit(self):
        print(self.name.title() + " is sitting now.")
# self 代表实例本身，所以可以访问到属性
    def bark(self):
        print(f"{self.name.title()}'s yelling now, sounds like {self.voice}。IT's {self.__color}")

# 以下是针对类的私有属性的封装,用于其读取和修改
    def get_color(self): # 获取
        return self.__color

    def set_color(self, color): # 修改
        self.__color = color #也可以添加验证.(if ... raise ...)

# 创建对象，即具体实例
my_dog = Dog('pan', 'wang')

# 外部访问类的属性
print(my_dog.name)
print(my_dog.voice)
# print(my_dog.__color)  # 私有属性，外部无法访问和修改。如果想要访问，可以封装通过方法访问或修改；例如以下方式

print(my_dog.get_color())  # 外部成功获取私有属性
my_dog.set_color('black')  # 外部成功修改私有属性


my_dog.sit()
my_dog.bark()